#include "cpu/exec/template-start.h"

// 定义指令宏，指令为 sub
#define instr sub

void do_execute() {
	// 计算操作数的差值，并将结果存储到目标操作数中
	DATA_TYPE result = op_dest->val - op_src->val;
	OPERAND_W(op_dest, result);
  
  // 更新标志寄存器的 PF、ZF 和 SF 标志位
  update_eflags_pf_zf_sf((DATA_TYPE_S)result);
	
	// 判断是否产生借位，若产生，则更新 CF 标志位
	cpu.eflags.CF = op_dest->val < op_src->val;

  // 根据操作数和结果的异或值来判断是否溢出，若有溢出，则更新 OF 标志位
  cpu.eflags.OF = MSB((op_dest -> val ^ op_src -> val) & (~(op_src -> val ^ result)));
	
	// 打印汇编指令模板
	print_asm_template2();
}

make_instr_helper(i2a)
make_instr_helper(i2rm)
make_instr_helper(r2rm)
make_instr_helper(rm2r)

// 若数据宽度为 2 字节或 4 字节，则调用辅助函数 si2rm
#if DATA_BYTE == 2 || DATA_BYTE == 4
make_instr_helper(si2rm)
#endif

#include "cpu/exec/template-end.h"

